<?php

class User extends DbItem {

    public static function instance($content, $mapping=null) {
        return new User($content, $mapping);
    }

    public function createMapping() {
        // Primero ligamos la tabla con la que vamos a trabajar, creando un mapping para el objeto.
        $this->mapping = new DbItemMapping("usuarios");
        // Declaramos el campo identificador (Debe ser único, ya que los borrados lo usarán como referencia).
        $this->mapping->addMapping(new MappingRule("id", "id", true, true))
                // Definimos mapeados directos a la db
                ->addMapping(new MappingRule("nombre", "nombre", false, true))
                ->addMapping(new MappingRule("email", "email", false, true))
                ->addMapping(new MappingRule("hash", "password", false, true))
                ->addMapping(new MappingRule("puntos", "puntos", false, true))
                ->addMapping(new MappingRule("lon", "longitud", false, true))
                ->addMapping(new MappingRule("lat", "latitud", false, true))
                ->addMapping(new MappingRule("agent", "iphone", false, true))
                // Definimos mapeados ficticios a la db
                ->addMapping(new MappingRule("edad", "DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(fecha_nacimiento)), '%Y')+0", false, false))
                ->addMapping(new MappingRule("es_vip", "(now()-vip)>0", false, false))
                ->addMapping(new MappingRule("usa_geoloc", "pow(longitud, 2)+pow(latitud, 2) > 0", false, false))
                ->addMapping(new MappingRule("is_online", "(conexion='Online') and (now()<3000+actividad)", false, false));
    }

    // Definimos métodos complementarios para el objeto.
    public function distancia($lon2, $lat2) {
        $lon1 = $this->lon;
        $lat1 = $this->lat;
        $dist = round(110.7 * sqrt(pow($lat1 - $lat2, 2) + pow($lon1 - $lon2, 2)));
        return $dist;
    }

}

?>
